Anne Badel & Jacques van Helden
29 mars 2021
Les données sont issues de la base Recount2. Nous avons sélectionné l’étude TCGA : The Cancer Genome Atlas, regroupant des données RNA-seq pour plus de 12.000 patients souffrant de différents types de cancer. Nous nous intéressons ici uniquement aux données Breast Invasive Cancer (BIC) concernant le cancer du sein.
Les données ont été préparées pour vous, selon la procédure détaillée au cours sur l’analyse différentielle de données RNA-seq.
Filtrage des gènes à variance nulle et de ceux contenant trop de zéros.
Normalisation (méthode robuste aux outliers)
Analyse différentielle multi-groupes (en utilisant le package Bioconductor edgeR).
Correction des P-valeurs pour tenir compte des tests multiples (nous avons testé ici ~20.000 gènes). Nous estimons le False Discovery Rate (FDR) selon la méthode de Benjamini-Hochberg (fonction R p.adjust(all.pvalues, method="fdr")).
Sélection de gènes différentiellement exprimés sur base d’un seuil \(\alpha = 0.05\) appliqué au FDR.
637E.4A4 11F.41D3 7FB8.471 EC6.4FB2
00003.14 16.52775 18.84599 18.67677 17.75458
00419.12 17.50349 17.01692 18.15315 19.34170
00457.13 17.96040 17.29379 17.51914 18.34039
00460.16 16.77151 16.30180 16.85386 17.75886
00938.12 15.13011 13.57196 15.04359 15.11192
00971.15 17.21899 20.05815 17.48420 18.33249
Pour des raisons historiques, en analyse transcriptomique les données sont toujours fournies avec
Cette convention a été établie en 1997, lors des toutes premières publications sur le transcriptome de la levure. Dans ces études, l’objet d’intérêt (l’“individu”) était le gène, et les variables étaient ses mesures d’expression dans les différentes conditions testées.
Pour l’analyse de tissus cancéreux, on considère au contraire que l’“objet” d’intérêt est l’échantillon prélevé sur le patient, et les variables sont les mesures d’expression des différents gènes chez un patient.
Classiquement, en analyse de données, les individus sont les lignes du tableau de données, les colonnes sont les variables.
Ce qui implique de faire attention, et éventuellement de travailler sur la matrice transposée (fonction t() en R) pour utiliser correctement les fonctions classiques.
00003.14 00419.12 00457.13 00460.16 00938.12 00971.15
637E.4A4 16.52775 17.50349 17.96040 16.77151 15.13011 17.21899
11F.41D3 18.84599 17.01692 17.29379 16.30180 13.57196 20.05815
7FB8.471 18.67677 18.15315 17.51914 16.85386 15.04359 17.48420
EC6.4FB2 17.75458 19.34170 18.34039 17.75886 15.11192 18.33249
1 ligne = 1 gène = 1 individu = 1 vecteur
1 colonne = 1 feature = 1 vecteur
l’ensemble des données = 1 data.frame
[1] 819 1000
00003.14 00419.12 00457.13 00460.16 00938.12
637E.4A4 16.52775 17.50349 17.96040 16.77151 15.13011
11F.41D3 18.84599 17.01692 17.29379 16.30180 13.57196
7FB8.471 18.67677 18.15315 17.51914 16.85386 15.04359
EC6.4FB2 17.75458 19.34170 18.34039 17.75886 15.11192
en tenant compte de l’ensemble des individus/ lignes et variables / colonnes = un nuage de points dans un espace à 1000 dimensions
= PAS de représentation possible (pour l’instant)
Nous utiliserons les termes anglais
en français :
On a pas d’information supplémentaire sur nos données, juste le data.frame contenant
Clustering : on cherche à mettre en évidence des groupes (/ des clusters) dans les données
On a une information** supplémentaire sur nos données : on connaît le partitionnement de notre jeu de données
Classification : on cherche un algorithme / un modèle permettant de prédire la classe, le groupe de tout individu dont on connait les caractéristiques
- y a t’il des groupes ? si oui, combien ?
Définition d’une distance : fonction positive de deux variables
Si 1,2,3 seulement: dissimilarité
| distance euclidienne | coefficient de corrélation | distance de corrélation | |
|---|---|---|---|
| A - B | 4.85 | 0.93 | 0.07 |
| A - C | 5.59 | -0.53 | 1.53 |
| B - C | 1.03 | -0.67 | 1.67 |
dist() avec l’option method = "euclidean", "manhattan", ...| t1 | t2 | t3 | t4 | t5 | |
|---|---|---|---|---|---|
| X | 2.93 | 4.66 | 4.69 | 2.11 | 3.09 |
| Y | 3.12 | 3.23 | 2.93 | 2.68 | 3.51 |
distance euclidienne : dist(mat.xy) = 2.38
distance de manhattan = dist(mat.xy, method = "manhattan") 4.38
1 - cor() avec l’option method = "pearson", "spearman", ...distance de corrélation = 1-cor(t(mat.xy) 0.75
2D80.49F D91.450F 0DD.4F9A 573E.42E
D91.450F 35
0DD.4F9A 33 33
573E.42E 53 54 53
CE60.480 31 29 23 52
2D80.49F D91.450F 0DD.4F9A 573E.42E
D91.450F 0.149
0DD.4F9A 0.143 0.140
573E.42E 0.287 0.293 0.294
CE60.480 0.118 0.111 0.076 0.279
00003.14 00419.12 00457.13 00460.16 00938.12
00419.12 1.270
00457.13 0.615 1.739
00460.16 0.651 1.402 0.087
00938.12 1.771 0.463 1.381 1.162
00971.15 0.458 1.875 0.112 0.335 1.731
Revenons à nos données
On peut ensuite essayer de visualiser les données
plot (! ne pas faire si “grosses” données)boxplot (! ne pas faire si “grosses” données)[1] 0
Afin de pouvoir considérer que toutes les variables sont à la même échelle, il est parfois nécessaire de standardiser les données.
soit
soit
classification hiérarchique : mettre en évidence des liens hiérachiques entre les individus
ressemblance entre individus = distance
ressemblance entre groupes d’invidus = critère d’aggrégation
départ : n individus = n clusters distincts
calcul des distances entre tous les individus
regroupement des 2 individus les plus proches => (n-1) clusters
calcul des dissemblances entre chaque groupe obtenu à l’étape \((j-1)\)
regroupement des deux groupes les plus proches => \((n-j)\) clusters
Faire attention au données
Choisir
adaptés à nos données
Les individus dans le plan
=> faire apparaitres des classes / des clusters
construction des centres de gravité des k clusters construits à l’étape \((j-1)\)
\(k\) nouveaux clusters créés à partir des nouveaux centres suivant la même règle qu’à l’étape \(0\)
obtention de la partition \(P_j\)
637E.4A4 11F.41D3 7FB8.471 EC6.4FB2 713.4383 9AA.4949 9951.4D4 AF7.4CBC EAD9.4BC 0319.4B5 A84.4B0B FDC1.414 008.44AF D0B.49F1 0930.403 3507.496 613.45DA C250.4F5 8AE.4245 792E.4DA
1 5 3 3 5 5 1 1 1 3 1 5 5 2 1 1 1 2 1 1
Ces méthodes non supervisées, sont sans a priori sur la structure, le nombre de groupe, des données.
rappel : un cluster est composé
si les individus d’un même cluster sont proches
si les individus de 2 clusters différents sont éloignés => variance inter forte
La coupure de l’arbre à un niveau donné construit une partition. la coupure doit se faire :
après les agrégations correspondant à des valeurs peu élevées de l’indice
avant les agrégations correspondant à des niveaux élevés de l’indice, qui dissocient les groupes bien distincts dans la population.
| k1 | k2 | k3 | |
|---|---|---|---|
| c1 | 75 | 325 | 21 |
| c2 | 0 | 91 | 1 |
| c3 | 153 | 17 | 44 |
| c4 | 0 | 1 | 91 |
| Algorithme | Pros | Cons |
|---|---|---|
| Hiérarchique | L’arbre reflète la nature imbriquée de tous les sous-clusters | Complexité quadratique (mémoire et temps de calcul) \(\rightarrow\) quadruple chaque fois qu’on double le nombre d’individus |
| Permet une visualisation couplée dendrogramme (groupes) + heatmap (profils individuels) | ||
| Choix a posteriori du nombre de clusters | ||
| K-means | Rapide (linéaire en temps), peut traiter des jeux de données énormes (centaines de milliers de pics ChIP-seq) | Positions initiales des centres est aléatoire \(\rightarrow\) résultats changent d’une exécution à l’autre |
| Distance euclidienne (pas appropriée pour transcriptome par exemple) |
Mesure de similarité entre deux clustering
à partir du nombre de fois que les clustering sont d’accord
\[R=\frac{m+s}{t}\]
[1] 0.705682
\[ \text{ARI} = \frac{\text{RI}-\text{E(RI)}}{\text{Max RI} - \text{E(RI)}}\]
[1] 0.3734816
POUR ALLER PLUS LOIN
distance euclidienne ou distance \(L_2\): \(d(x,y)=\sqrt{\sum_i (x_i-y_i)^2}\)
distance de manahattan ou distance \(L_1\): \(d(x,y)=\sum_i |x_i-y_i|\)
distance du maximum ou L-infinis, \(L_\infty\): \(d(x,y)=\max_i |x_i-y_i|\)
distance de Minkowski \(l_p\): \[d(x,y)=\sqrt[p]{\sum_i (|x_i-y_i|^p}\]
distance de Canberra (x et y valeurs positives): \[d(x,y)=\sum_i \frac{x_i-y_i}{x_i+y_i}\]
distance binaire ou distance de Jaccard ou Tanimoto: proportion de propriétés communes
Note : lors du TP, sur les données d’expression RNA-seq, nous utiliserons le coefficient de corrélation de Spearman et la distance dérivée, \(d_c = 1-r\)
Utilisées en bio-informatique:
Distance de Hamming: nombre de remplacements de caractères (substitutions)
Distance de Levenshtein: nombre de substitutions, insertions, deletions entre deux chaînes de caractères
\[d("BONJOUR", "BONSOIR")=2\]
Distance d’alignements: distances de Levenshtein avec poids (par ex. matrices BLOSSUM)
Distances d’arbre (Neighbor Joining)
Distances ultra-métriques (phylogénie UPGMA)
Il existe d’autres mesures de distances, plus ou moins adaptées à chaque problématique :
Jaccard (comparaison d’ensembles): \(J_D = \frac{A \cap B}{A \cup B}\)
Distance du \(\chi^2\) (comparaison de tableau d’effectifs)
Ne sont pas des distances, mais indices de dissimilarité :
Bray-Curtis (en écologie, comparaison d’abondance d’espèces)
Jensen-Shannon (comparaison de distributions) # Distance avec R : indice de Jaccard
ou pour des distances particulières, par exemple l’indice de Jaccard :
| v.a | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
| v.b | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
| v.c | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
v.a v.b
v.b 0.3333333
v.c 0.0000000 0.3333333
par(mfrow = c(1,2))
biplot(prcomp(BIC.expr), las = 1, cex = 0.7,
main = "Données non normalisées")
biplot(prcomp(BIC.expr, scale = TRUE), las = 1, cex = 0.7,
main = "Données normalisées")On considère les données comme des points de \(\mathbb{R}^n\)
\(\mathbb{R}^n\) : espace Euclidien à \(n\) dimensions, où
On considère les données comme des points de \(R^n\) (*)
Sur la base d’une distance
## Plot distances between 3 points in a 2D Euclidian space
plot(x = 0, y = 0, type = "n", xlim = c(0, 5), ylim = c(0, 5),
xlab = "", ylab = "", las = 1,
main = "3 individuals in a 2-D space\nDot plot representation",
panel.first = grid())
points(x = 1, y = 1, col = "blue", pch = 19)
text(x = 1, y = 1, col = "blue", label = "A", pos = 2)
points(x = 2, y = 0, col = "green", pch = 19)
text(x = 2, y = 0, col = "green", label = "B", pos = 4)
points(x = 4, y = 4, col = "red", pch = 19)
text(x = 4, y = 4, col = "red", label = "C", pos = 4)\[D(C_1,C_2) = \min_{i \in C_1, j \in C_2} D(x_i, x_j)\]
\[D(C_1,C_2) = \max_{i \in C_1, j \in C_2} D(x_i, x_j)\]
\[D(C_1,C_2) = \frac{1}{N_1 N_2} \sum_{i \in C_1, j \in C_2} D(x_i, x_j)\]
\(d^2(C_i,C_j) = I_{intra}(C_i \cup C_j)-I_{intra}(C_i)-I_{intra}(C_j)\)
\(D(C_1,C_2) = \sqrt{\frac{N_1N_2}{N_1 + N_2}} \| m_1 -m_2 \|\)
dist() avec l’option method = "euclidean", "manhattan", ...| t1 | t2 | t3 | t4 | t5 | SUM | |
|---|---|---|---|---|---|---|
| X | 3.39 | 4.84 | 1.91 | 3.54 | 3.72 | 17.40 |
| Y | 3.05 | 2.83 | 3.82 | 3.16 | 3.01 | 15.86 |
| abs(Y - X) | 0.34 | 2.01 | 1.91 | 0.38 | 0.72 | 5.35 |
| (Y - X)^2 | 0.11 | 4.04 | 3.65 | 0.14 | 0.52 | 8.46 |
| Eucl | 0.34 | 2.01 | 1.91 | 0.38 | 0.72 | 2.91 |
distance euclidienne : 2.91
distance de manhattan = 5.35
1 - cor() avec l’option method = "pearson", "spearman", ...distance de corrélation = 1.95
… c’est à dire aux options des fonctions dist() et hclust()
par(mfrow = c(2, 1))
plot(BIC.hclust, hang = -1, cex = 0.5, main = "Données brutes")
plot(BIC.scale.hclust, hang = -1, cex = 0.5, main = "Normalisées")Contact: anne.badel@univ-paris-diderot.fr
Comment comparer des vecteurs-individus ?